import os
import subprocess
import sys
import time

def run_command(command, check=True, capture_output=True):
    """执行Git命令并返回结果"""
    print(f"执行命令: {' '.join(command)}")
    result = subprocess.run(command, check=check, capture_output=capture_output, text=True)
    if result.stdout:
        print(f"标准输出: {result.stdout.strip()}")
    if result.stderr:
        print(f"标准错误: {result.stderr.strip()}")
    return result

def get_current_branch():
    """获取当前Git分支名称"""
    try:
        result = run_command(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], check=True)
        return result.stdout.strip()
    except Exception as e:
        print(f"获取当前分支失败: {e}")
        return "main"  # 默认使用main分支

def setup_remote(repo_url):
    """设置远程仓库"""
    try:
        # 检查远程仓库是否已存在
        result = run_command(['git', 'remote', 'get-url', 'origin'], check=False)
        if result.returncode != 0:
            # 如果远程仓库不存在，添加它
            print("添加远程仓库 'origin'...")
            run_command(['git', 'remote', 'add', 'origin', repo_url], check=True)
        else:
            # 如果远程仓库已存在，更新它
            current_url = result.stdout.strip()
            if current_url != repo_url:
                print(f"更新远程仓库 'origin' 的URL从 {current_url} 到 {repo_url}...")
                run_command(['git', 'remote', 'set-url', 'origin', repo_url], check=True)
        
        # 验证远程仓库设置
        print("验证远程仓库设置...")
        run_command(['git', 'remote', '-v'], check=True)
        return True
    except Exception as e:
        print(f"设置远程仓库失败: {e}")
        return False

def push_to_gitee(repo_url, branch=None, commit_message='Auto commit'):
    """
    推送当前目录到Gitee仓库
    
    参数:
    repo_url: Gitee仓库URL
    branch: 分支名称，默认为None（使用当前分支）
    commit_message: 提交信息
    """
    try:
        # 检查Git是否安装
        run_command(['git', '--version'], check=True)
        print("Git已安装")
        
        # 检查当前目录是否为Git仓库
        if not os.path.exists('.git'):
            print("初始化Git仓库...")
            run_command(['git', 'init'], check=True)
        
        # 设置远程仓库
        if not setup_remote(repo_url):
            print("远程仓库设置失败，无法继续")
            return False
        
        # 如果没有指定分支，获取当前分支
        if branch is None:
            branch = get_current_branch()
            print(f"使用当前分支: {branch}")
        
        # 添加所有文件
        print("添加文件...")
        run_command(['git', 'add', '.'], check=True)
        
        # 尝试提交更改（忽略如果没有更改的情况）
        print(f"提交更改: {commit_message}")
        try:
            run_command(['git', 'commit', '-m', commit_message], check=True)
        except subprocess.CalledProcessError:
            print("没有更改需要提交")
        
        # 推送更改 - 尝试不同的推送策略
        print(f"推送至 {repo_url} 的 {branch} 分支...")
        try:
            # 首先尝试普通推送
            run_command(['git', 'push', '-u', 'origin', branch], check=True)
        except subprocess.CalledProcessError:
            # 如果失败，尝试强制推送
            print("普通推送失败，尝试强制推送...")
            try:
                run_command(['git', 'push', '-u', 'origin', branch, '--force'], check=True)
            except subprocess.CalledProcessError:
                # 如果仍然失败，尝试先拉取再推送
                print("强制推送失败，尝试先拉取再推送...")
                try:
                    run_command(['git', 'pull', 'origin', branch, '--allow-unrelated-histories'], check=True)
                    run_command(['git', 'push', '-u', 'origin', branch], check=True)
                except subprocess.CalledProcessError:
                    print("所有推送尝试都失败了")
                    raise
        
        print("推送成功!")
        return True
    except subprocess.CalledProcessError as e:
        print(f"Git命令执行失败: {e}")
        return False
    except Exception as e:
        print(f"未预期的错误: {e}")
        return False

if __name__ == "__main__":
    # 默认参数
    REPO_URL = "https://gitee.com/renovate_dream_0/star.git"
    BRANCH = None  # 不指定分支，使用当前分支
    
    # 从命令行参数获取（如果提供）
    if len(sys.argv) > 1:
        REPO_URL = sys.argv[1]
    if len(sys.argv) > 2:
        BRANCH = sys.argv[2] if sys.argv[2].strip() else None
    
    # 使用当前日期和时间作为提交信息
    commit_msg = f"Auto commit - {time.strftime('%Y-%m-%d %H:%M:%S')}"
    
    print(f"目标仓库: {REPO_URL}")
    if BRANCH:
        print(f"目标分支: {BRANCH}")
    
    push_to_gitee(REPO_URL, BRANCH, commit_msg)